package com.m1.tzolkin.model;

import java.io.Serializable;

import com.m1.tzolkin.model.board.ITZBoard;
import com.m1.tzolkin.model.exceptions.NoAvailableSkullException;
import com.m1.tzolkin.model.exceptions.NotAvailableActionException;
import com.m1.tzolkin.model.exceptions.NotEnoughCornException;
import com.m1.tzolkin.model.players.ITZPlayer;

/**
 * Une action jouable sur une case.
 * Une action donne des ressources au joueur qui l'appelle, ou modifie ses permissions
 *  pour lui permettre d'effectuer diff�rentes choses.
 */
public interface IAction extends Serializable, ObservableModel {
	
	// REQUETES
	
	/**
	 * Retourne si l'action est r�alisable.
	 */
	boolean isAvailable();
	
	/**
	 * Retourne le type de cette action si elle est remarquable.
	 */
	ActionType getType();

	// COMMANDES
	
	/**
	 * Affectue l'action, c'est-�-dire donne au joueur courant de b des ressources et/ou
	 *  modifie ses permissions.
	 */
	void doAction(ITZBoard b, ITZPlayer p) throws NotAvailableActionException, NoAvailableSkullException, NotEnoughCornException;
	
}
